package com.atguigu.java;

import java.lang.annotation.Target;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author shkstart
 * @create 2022-08-06-20:30
 */
public class ArrayHomeWork {

    public static void main(String[] args) {

        ArrayHomeWork homeWork = new ArrayHomeWork();
        int[] arr1 = {2,2,1};
        int[] arr2 = {4,1,2,1,2};
//        System.out.println(homeWork.consecutiveOdds(arr1));
//        System.out.println(homeWork.consecutiveOdds(arr2));
//        System.out.println(homeWork.manyNum(arr1));
//        System.out.println(homeWork.manyNum(arr2));
        int i = singleNum(arr2);
        System.out.println(i);
    }


    /**
     * 1.存在连续三个奇数的数组Num1550
     * 题目内容:
     * 给你一个整数数组 arr，请你判断数组中是否存在连续三个元素都是奇数的情况:
     * 如果存在，请返回 true ;否则，返回 false .
     * 示例1:
     * 输入: arr = [2,6,4,1]输出: false
     * 解释:不存在连续三个元素都是奇数的情况。
     * 示例2:
     * 输入: arr = [ 1,2,34,3,4,5,7,23,12]输出: true
     * 解释:存在连续三个元素都是奇数的情况，即[5,7,23] 。
     */
    public boolean consecutiveOdds(int[] num) {

//        for (int i = 0; i < arr.length; i++) {
//            if (arr[i] % 2 != 0) {
//                if (i + 3 < arr.length) {
//                    for (int j = 1; j < 4; j++) {
//                        if (arr[i + j] % 2 != 0) {
//                            return true;
//                        }
//                    }
//                }
//            }
//        }
//        return false;
        int count = 0;
        for (int i : num) {
            if (i % 2 != 0) {
                count++;
            } else {
                count = 0;
            }

            if (count == 3) {
                return true;
            }

        }
        return false;
    }

    /**
     * 2.多数元素Num169题目内容:
     * 给定一个大小为  n 的数组，找到其中的多数元素。
     * 多数元素是指在数组中出现次数大于 L n/2 」的元素。
     * 你可以假设数组是非空的，并且给定的数组总是存在多数元素。
     * 示例1:
     * 输入:[3,2,3]输出:3
     * 示例2：
     * 输入：[2，2，1，1，1，2]输出：2
     */
    public int manyNum(int[] num) {

        HashMap<Integer, Integer> hashMap = new HashMap<>();
//      遍历数组的过程中，将不重复的元素以及出现的次数存储到映射中
        for (int i = 0; i < num.length; i++) {
//            若此时映射中存在元素
            if (hashMap.containsKey(num[i])) {
                //此时只需要将出现的次数+1
                int value = hashMap.get(num[i]);
                hashMap.put(num[i], value + 1);
            } else {
                //此时映射中还没有该元素
                //哈希表的存储方法put(不重复的元素，value)
                hashMap.put(num[i], 1);
            }
        }
        //在数据集中查找出现次数> n/2的元素
        //哈希表的遍历
        Set<Map.Entry<Integer, Integer>> set = hashMap.entrySet();
        for (Map.Entry<Integer, Integer> entry : set) {
            //取出每个元素的value值(出现的次数）

                    //次数
            if (entry.getValue() > num.length/2) {
                return entry.getKey();//元素
            }
        }
        return -1;

    }

    /**
     * 3.只出现一次的数字Num136题目内容:
     * 给定一个非空整数数组，除了某个元素只出现一次以外，
     * 其余每个元素均出现两次。找出那个只出现了一次的元素
     * 示例1:
     * 输入:[2,2,1]输出:1
     * 示例2:
     * 输入:[4,1,2,1,2]输出:4
     */
    public static int singleNum(int[] num){
        HashMap<Integer,Integer> hsaMap = new HashMap<>();
        for (int i = 0; i <num.length; i++) {
            if(hsaMap.containsKey(num[i])){

                hsaMap.put(num[i],2);
            }else{
                hsaMap.put(num[i],1);
            }
        }

        Set<Map.Entry<Integer, Integer>> set = hsaMap.entrySet();
        for (Map.Entry<Integer,Integer>entry:set    ) {
            if(entry.getValue()==1){
                return entry.getKey();
            }

        }return  -1;

    }

    /**
     * 4.题目内容:
     * 给定一个整数数组 nums和一个整数目标值 target，
     * 请你在该数组中找出和为目标值target 的那两个整数，
     * 并返回它们的数组下标。
     * 你可以假设每种输入只会对应一个答案。
     * 但是，数组中同一个元素在答案里不能重复出现x你可以按任意顺序返回答案。
     * 示例1
     * 输入: nums = [2,7,11,15]， target = 9输出:[e,1]
     * 解释:因为nums[0] + nums[1] == 9 ，返回 [0，1] 。
     */
    public int[] finarry(int num[], int target){
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < num.length; i++) {
            int value = num[i];
            if(map.containsKey(target-value)){
                return new int[]{i,map.get(target-value)};
            }
        }
        return new int[]{0};


    }


}
